home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ9110.ZIP / STRINGCL.ASC < prev    next >
Text File  |  1991-09-10  |  9KB  |  361 lines

  1. _PROPOSING A C++ STRING CLASS_
  2. by Steve Teale
  3.  
  4. [LISTING ONE]
  5.  
  6.  
  7. class String {
  8. public:
  9. // String class constants
  10.     enum string_enum { all = INT_MAX };
  11.  
  12. // Constructors / destructor
  13.     String();                // make an empty String
  14.     String(const String&);       // make a String by copying another
  15.     String(const char *, int count = 0); 
  16.                                  // make a String from a regular C style string
  17.     String(char);            // make a String from a single char
  18.  
  19.     ~String();             // Clean up after a String goes out of scope
  20.  
  21. // Assignments
  22.     String &operator=(const String&);   // Assign from another String
  23.     String &operator=(const char *);    // Assign from a C style string
  24.     String &operator=(char);        // Assign from a single char
  25.     String &operator+=(const String&);  
  26.                                   // Concatenate a String to an existing String
  27.     String &operator+=(const char *);   
  28.                                     // Concatenate a C style string to a String
  29.     String &operator+=(char);       // Concatenate a char
  30.  
  31. // Other modifiers
  32.     String &insert(int pos, const String&);  // Insert into an existing string
  33.     String &insert(int pos, const char *);
  34.     String &insert(int pos, char);
  35.     String &remove(int pos, int count); // Remove from an existing string
  36.     String &truncate(int);      // Truncate a String
  37.  
  38. // Conversions
  39.     operator char*() const;    
  40.                      // Translate a String to a pointer to its first character
  41.     operator char() const;     // Translate a String to its initial character
  42.  
  43. // Mutators (make an existing String into a variant)
  44.     String upper() const;      // Make a new String by conversion to uppercase
  45.     String lower() const;
  46.     String operator()(int start, int len); 
  47.                    // Make a new String starting from start, of len characters
  48.  
  49. // Access individual characters
  50.     char &operator[](int);    // Access individual characters as if the String
  51.                   // were an array
  52.     char operator()(int);     // Get the character value of the i'th character.
  53.  
  54. // Searches
  55.     int match(const String&) const; è                             // Return position of first non-matching character
  56.     int match(const char *) const;
  57.     int index(const String&, int pos = 0) const;
  58.     int index(const char *, int = 0) const;
  59.                              // Find the position of a substring or character
  60.     int index(char, int = 0) const;
  61.  
  62. // Statistics
  63.     int operator!() const;  // Test for an empty string
  64.     int length() const;     // Get the length of the String
  65.  
  66. // Some of the properties of a String are provided by functions which 
  67. // are friends of the String class
  68.  
  69. friend int strlen(const String&);   // Parallel the ANSI C string functions
  70. // etc
  71.  
  72. // Concatenations to make a new String
  73. friend String operator+(const String&, const String&);
  74. friend String operator+(const String&, const char *);
  75. friend String operator+(const char *, const String&);
  76.  
  77. // Boolean tests
  78. friend int operator==(const String&, const String&);
  79. friend int operator==(const String&, const char *);
  80. friend int operator==(const char *, const String&);
  81. friend int operator!=(const String&, const String&);
  82. friend int operator!=(const String&, const char *);
  83. friend int operator!=(const char *, const String&);
  84. friend int operator>(const String&, const String&);
  85. friend int operator>(const String&, const char *);
  86. friend int operator>(const char *, const String&);
  87. friend int operator<(const String&, const String&);
  88. friend int operator<(const String&, const char *);
  89. friend int operator<(const char *, const String&);
  90. friend int operator>=(const String&, const String&);
  91. friend int operator>=(const String&, const char *);
  92. friend int operator>=(const char *, const String&);
  93. friend int operator<=(const String&, const String&);
  94. friend int operator<=(const String&, const char *);
  95. friend int operator<=(const char *, const String&);
  96.  
  97. // Input/ output operations
  98. friend istream &operator>>(istream&, String&);
  99. friend ostream &operator<<(ostream&, const String&);
  100. };
  101.  
  102.  
  103. [LISTING TWO]
  104.  
  105.  
  106. #ifndef __STRING_HPP
  107. #define __STRING_HPP
  108. #include <limits.h>
  109. èclass istream;   // forward declarations to avoid including all of iostream.hpp
  110. class ostream;
  111.  
  112. class srep {        // actual string representation
  113. friend class String;
  114. private:
  115.     srep(int, const char * = 0);
  116.     void *operator new(size_t cs, size_t ss = 0);
  117.  
  118.     int refs;
  119.     int length;
  120.     char body[1];
  121. };
  122.  
  123. class String {
  124. public:
  125.     // as above
  126. private:
  127.     char *body() const { return rp? rp->body: 0; }
  128.  
  129.     srep *rp;
  130.     static char dummy;
  131. };
  132.  
  133. inline int strlen(const String &s)
  134. {
  135.     return s.length();
  136. }
  137.  
  138. // and other friend functions which can conveniently be defined inline
  139.  
  140. #endif
  141.  
  142.  
  143.  
  144.  
  145. Figurσ 1
  146.  
  147. (a)
  148.  
  149.     String &operator=(char);
  150.     String &operator+=(char);
  151.  
  152.     String &insert(int, const String&);
  153.     String &insert(int, const char *);
  154.     String &insert(int, char);
  155.     String &remove(int, int);
  156.  
  157.     int operator!();
  158.  
  159.  
  160. (b)
  161.  
  162. String a;
  163. èif (!a) ...;        // if a is empty string
  164. if (a) ...;     // if a is not empty - uses operator char *()
  165.  
  166.  
  167. (c)
  168.  
  169. friend int operator==(const String&, const String&);
  170. friend int operator==(const String&, const char *);
  171. friend int operator==(const char *, const String&);
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179. Figure 2
  180.  
  181. (a)
  182.  
  183.     String a;
  184.     ...
  185.     if (a == "whatever")
  186.         ...;
  187.  
  188. will cause a sequence something like:
  189.  
  190.     String temp = "whatever";   // constructor from const char *
  191.     if (operator==(a, temp))
  192.         ...;
  193.     // temp destructor call
  194.  
  195.  
  196. (b)
  197.  
  198. // two members
  199.     int operator==(const String&);
  200.     int operator==(const char *);
  201.  
  202. // and a friend
  203. friend int operator==(const char *, const String&);
  204.  
  205.  
  206.  
  207.  
  208. Figure 3
  209.  
  210.  
  211. (a)
  212.  
  213. String t;           // an empty string
  214. String a  = "good girl";    // initialized from a regular C style string
  215. String b = a;       // the copy constructor
  216. String c = '.';
  217. èThis is the idiomatic usage.  It would have just the same effect to write:
  218.  
  219. String a("good girl");
  220. String b(a);
  221. String c('.');
  222.  
  223.  
  224. (b)
  225.  
  226.  
  227. String d("good girl", 4);
  228. // same effect as String d = "good";
  229.  
  230.  
  231. (c)
  232.  
  233.  
  234. String v = "abcd";
  235. v += 1;         // result "bcde" ?
  236.  
  237. String w = "provided"
  238. w  -= "vide"        // result "prod" ?
  239. w -= 'r';           // result "pod"   ?
  240.  
  241. String x = "1234567890"
  242. x <<= 1;            // result "2345678901"
  243.  
  244.  
  245.  
  246.  
  247. Figure 4
  248.  
  249. (a)
  250.  
  251.  
  252.     operator char();    // conversion to a char
  253.     operator char *();  // conversion to a char *
  254.  
  255. (b)
  256.  
  257.     void show(char c)
  258.     {
  259.         cout << c << ' ' << int(c) << endl;
  260.     }
  261.  
  262.     char array[4] = { '\0', '\0', '\0', '\0' };
  263.  
  264.     String nulls(array,4);
  265.     String empty;
  266.  
  267.     show(nulls);
  268.     show(empty);
  269.  
  270.  
  271. èFigure 5
  272.  
  273. (a)
  274.  
  275.     String String::upper() const;
  276.     String String::lower() const;
  277.     String String::operator()(int start, int length) const;
  278.     String operator+(const String &a, const String &b);
  279.     String operator+(const String &a, const char *b);
  280.     String operator+(const char *a, const String &b);
  281.  
  282.  
  283. (b)
  284.  
  285.  
  286.     String a = "Cat";
  287.     a(0) = 'R';         // a gets "Rat"
  288.     // a.operator()(0) = 'R';
  289.  
  290.  
  291.  
  292.  
  293. Figure 6
  294.  
  295. (a)
  296.  
  297. String a = "The quick brown fox jumped over the lazy dogs back";
  298. String b = "The queen";
  299. String c = "lazy";
  300.  
  301. a.match(b);         // returns 7
  302. a.match("The quick");       // returns -1
  303.  
  304. a.index(b);         // returns -1
  305. a.index(c);         // returns 36
  306. a.index("The", 1);      // returns -1
  307. a.index("The");         // returns 0
  308. a.index("the");         // returns 32
  309. a.index('b');           // returns 10
  310. a.index('b',11);            // returns 46
  311.  
  312.  
  313. (b)
  314.  
  315.  
  316. // C style
  317.     char *s1 = "Joe", *s2 = "Fred";
  318.     if (s1 > s2) ...;           // legal, but not usually what was intended!
  319.     if (!strcmp(s1,s2)) ...;        // proper test for equality
  320.  
  321. // C++ style
  322.  
  323.     String s1 = "Joe", s2 = "Fred";
  324.     if (s1 > s2) ...;           // evaluates to true
  325.     if (s1 == s2) ...;          // proper test for equality
  326.  
  327.  
  328. Figure 6
  329.  
  330. (a)
  331.  
  332. String a = "The quick brown fox jumped over the lazy dogs back";
  333. String b = "The queen";
  334. String c = "lazy";
  335.  
  336. a.match(b);         // returns 7
  337. a.match("The quick");       // returns -1
  338.  
  339. a.index(b);         // returns -1
  340. a.index(c);         // returns 36
  341. a.index("The", 1);      // returns -1
  342. a.index("The");         // returns 0
  343. a.index("the");         // returns 32
  344. a.index('b');           // returns 10
  345. a.index('b',11);            // returns 46
  346.  
  347.  
  348. (b)
  349.  
  350.  
  351. // C style
  352.     char *s1 = "Joe", *s2 = "Fred";
  353.     if (s1 > s2) ...;           // legal, but not usually what was intended!
  354.     if (!strcmp(s1,s2)) ...;        // proper test for equality
  355.  
  356. // C++ style
  357.  
  358.     String s1 = "Joe", s2 = "Fred";
  359.     if (s1 > s2) ...;           // evaluates to true
  360.     if (s1 == s2) ...;          // proper test for equality
  361.